#ifndef METANET_MODULE_H
#define METANET_MODULE_H

struct metanet_context;

typedef void *(*metanet_dl_create)(void);
typedef int (*metanet_dl_init)(void *inst, struct metanet_context *mod, const char *param);
typedef void (*metanet_dl_release)(void *inst);
typedef void (*metanet_dl_signal)(void *inst, int signal);

struct metanet_module {
    const char *name;
    void *dl;
    metanet_dl_create create;
    metanet_dl_init init;
    metanet_dl_release release;
    metanet_dl_signal signal;
};

void metanet_module_insert(struct metanet_module *mod);
struct metanet_module *metanet_module_query(const char *name);
void *metanet_module_instance_create(struct metanet_module *mod);
int metanet_module_instance_init(struct metanet_module *mod, void *inst, struct metanet_context *ctx, const char *param);
void metanet_module_instance_release(struct metanet_module *mod, void *inst);
void metanet_module_instance_siganl(struct metanet_module *mod, void *inst, int siganl);

void metanet_module_init(const char *path);
void metanet_module_exit();

#endif // !METANET_MODULE_H